package com.zrrd.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * @author WanJl
 * @version 1.0
 * @title MybatisConfig
 * @description
 * @create 2024/1/26 10:40
 */
public class MybatisConfig {

    /**
     *
     * 在mybatis的时候，需要手动创建SqlSessionFactory对象，
     * 通过这个工厂对象来开启一个SqlSession会话对象。
     * 在spring整合mybatis的时候，
     * SqlSessionFactory对象和Mapper代理对象都是交给spring来创建和管理。
     * 我们只需要向IOC容器中注入Bean就可以了。
     * 为了帮助注入Bean，mybtais-spring给我们提供了一个类
     * 就是SqlSessionFactoryBean类型。
     * 创建SqlSessionFactoryBean对象，把它注入到IOC容器。
     * 以后通过IOC容器拿到了SqlSessionFactoryBean对象，
     * 也就获取到SqlSessionFactory对象了。
     *
     * @param dataSource
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.zrrd.pojo");//取别名
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

    /**
     * 定义bean，返回MapperScannerConfigurer对象
     *
     * MapperScannerConfigurer:替换mybatis核心配置文件中的mappers标签
     * 用于自动扫描Mapper接口并注入到Spring容器中。
     * Mapper接口是定义了数据访问代码和SQL语句的接口，
     * 通过MapperScannerConfigurer可以快速扫描Mapper接口并将其注入到IOC容器中，
     * 使得我们在业务逻辑层中可以直接使用Mapper接口中的方法进行数据访问。
     * MapperScannerConfigurer类主要完成以下功能：
     * 1.扫描指定的包路径下所有的Mapper接口。
     * 2.将扫描到的Mapper接口生成代理对象，并注入到IOC容器中，以便在业务逻辑层中使用。
     * 在配置MapperScannerConfigurer时，需要设置Mapper接口所在的包路径、注入时用到的Bean信息等。
     *
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.zrrd.mapper");
        return msc;
    }
}
